#pragma once

#include "queue.hpp"
#include "util.hpp"
#include <atomic>
#include <vector>

namespace Thread::detail {
// 前置声明worker类和Shared类
class Worker;

class Shared;
// 管理和操作共享变量的类
class Shared : util::Nocopyable {
public:
  util::GlobalQueue &globalqueue() { return __globalqueue; }
  bool global_empty() { return __globalqueue.empty(); }

  void push_global_task(std::function<void()> func) {
    __globalqueue.push(func);
  }

  std::optional<std::function<void()>> get_next_global_task() {
    return __globalqueue.try_pop();
  }
  std::vector<std::function<void()>> get_global_task_batch(std::size_t n) {
    return __globalqueue.try_pop_batch(n);
  }
  std::vector<Worker *> &get_workers() { return __workers; }

  void shutdown() {
    __shutdown = true;
    __globalqueue.close();
  }
  bool is_shutdown() { return __shutdown; }

private:
  util::GlobalQueue __globalqueue{};   // 所有worker共享一个全局队列
  std::vector<Worker *> __workers{};   // 存放所有worker的数组
  std::atomic<bool> __shutdown{false}; // 关机标志位
};
} // namespace Thread::detail